package com.copsoftware.procesos.investigacion.service;

import java.util.ArrayList;
import java.util.Collection;

import org.hibernate.Session;
import org.hibernate.Transaction;
import org.springframework.beans.BeanUtils;

import com.copsoftware.entity.DenAcusadoInvestigacionIdImpl;
import com.copsoftware.entity.DenAcusadoInvestigacionImpl;
import com.copsoftware.entity.DenExpertoInvestigacionImpl;
import com.copsoftware.entity.DenInvestigacionImpl;
import com.copsoftware.entity.DenTestigoInvestigacionIdImpl;
import com.copsoftware.entity.DenTestigoInvestigacionImpl;
import com.copsoftware.hibernate.cfg.HibernateUtils;
import com.copsoftware.hibernate.pojo.DenExpertoInvestigacionId;
import com.copsoftware.mantenimientos.acusado.beans.AcusadoInvestigacion;
import com.copsoftware.mantenimientos.persona.beans.PersonaCompletaFlt;
import com.copsoftware.mantenimientos.testigo.beans.TestigoInvestigacion;
import com.copsoftware.procesos.investigacion.bean.InvestigacionBean;
import com.copsoftware.procesos.investigacion.dao.InvestigacionDAO;

public class InvestigacionService {
	
	public void guardarInvestigacion(InvestigacionBean investigacionBean) {
		DenInvestigacionImpl denInvestigacion = getInvestigacion(investigacionBean.getCInvestigacion());
		
		if (investigacionBean.getCInvestigacion() == null)
			investigacionBean.setCEstado(DenInvestigacionImpl.ESTADO_ACTIVADA);
		
		BeanUtils.copyProperties(investigacionBean, denInvestigacion);

		Session session = HibernateUtils.getSessionFactory()
				.getCurrentSession();
		Transaction tx = null;
		
		try {
			tx = session.beginTransaction();
			InvestigacionDAO investigacionDAO = new InvestigacionDAO();
			investigacionDAO.setSession(session);
			investigacionDAO.guardarInvestigacion(denInvestigacion);
			

				
			//SE ACTUALIZA LA REFERENCIA DE LA INVESTIGACION A LA DENUNCIAS
			/* DENUNCIAS*/
			if (investigacionBean.getIdSeleccionDenuncia() != null)
			{
				for (int i=0; i < investigacionBean.getIdSeleccionDenuncia().length ; i++)
					{
						
						if ((investigacionBean.getIdSeleccionDenuncia()[i]) != null)
						investigacionDAO.actualizarInvestigacionDenuncia(denInvestigacion.getCInvestigacion(), 
						Integer.parseInt(investigacionBean.getIdSeleccionDenuncia()[i]));
					}
			}	
			
			/* EXPERTOS*/
			if (investigacionBean.getIdSeleccionExperto() != null)
			{
				for (int i=0; i < investigacionBean.getIdSeleccionExperto().length ; i++)
					{
						if ((investigacionBean.getIdSeleccionExperto()[i]) != null)
						{
							DenExpertoInvestigacionImpl denExpertoInvestigacionImpl = new DenExpertoInvestigacionImpl();
							denExpertoInvestigacionImpl.setDenInvestigacion(denInvestigacion);
							denExpertoInvestigacionImpl.setId(new DenExpertoInvestigacionId());
							denExpertoInvestigacionImpl.getId().setCExperto(Integer.parseInt(investigacionBean.getIdSeleccionExperto()[i]));
							denExpertoInvestigacionImpl.getId().setCInvestigacion(denInvestigacion.getCInvestigacion());
				//denExpertoInvestigacionImpl.setId(denExpertoInvestigacionImpl.getId());
							investigacionDAO.guardarExpertos(denExpertoInvestigacionImpl);
						}
					}
			}
			
			/* TESTIGOS*/
			if (investigacionBean.getIdSeleccionTestigo() !=null)
			{
				for (int i=0; i < investigacionBean.getIdSeleccionTestigo().length ; i++)
				{
					if ((investigacionBean.getIdSeleccionTestigo()[i]) != null)
					{		DenTestigoInvestigacionImpl denTestigoInvestigacionImpl = new DenTestigoInvestigacionImpl();
							denTestigoInvestigacionImpl.setId(new DenTestigoInvestigacionIdImpl());
							denTestigoInvestigacionImpl.getId().setCInvestigacion(denInvestigacion.getCInvestigacion());
							denTestigoInvestigacionImpl.getId().setCTestigo(Integer.parseInt(investigacionBean.getIdSeleccionTestigo()[i]));
							investigacionDAO.guardarTestigosInvestigacion(denTestigoInvestigacionImpl);
					}
				}
			}
			
			/* ACUSADOS */
			if (investigacionBean.getIdSeleccionAcusado()!=null)
			{
				for (int i=0; i < investigacionBean.getIdSeleccionAcusado().length ; i++)
				{
					if ((investigacionBean.getIdSeleccionAcusado()[i]) != null && (!investigacionBean.getIdSeleccionAcusado()[i].equals("")))
					{		DenAcusadoInvestigacionImpl denAcusadoInvestigacionImpl = new DenAcusadoInvestigacionImpl();
							denAcusadoInvestigacionImpl.setId(new DenAcusadoInvestigacionIdImpl());
							denAcusadoInvestigacionImpl.getId().setCInvestigacion(denInvestigacion.getCInvestigacion());
							denAcusadoInvestigacionImpl.getId().setCAcusado(Integer.parseInt(investigacionBean.getIdSeleccionAcusado()[i]));
							investigacionDAO.guardarAcusadosInvestigacion(denAcusadoInvestigacionImpl);
					}
				}
			}
			
			
			tx.commit();
			
			BeanUtils.copyProperties(denInvestigacion, investigacionBean);
			
			
			//investigacionBean.setCInvestigacion(denInvestigacion.getCInvestigacion());
			//investigacionBean.setXEstado(denInvestigacion.getDenEstadoInvestigacion().getXEstado());
			
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			tx.rollback();
		}
	}
	
	private DenInvestigacionImpl getInvestigacion(Integer cInvestigacion) {
		DenInvestigacionImpl denInvestigacion= null;
		if (cInvestigacion == null) {
			denInvestigacion = new DenInvestigacionImpl();
		} else {
			denInvestigacion = buscarInvestigacion(cInvestigacion);
		}
		return denInvestigacion;
	}
	
	
	private DenInvestigacionImpl buscarInvestigacion(Integer cInvestigacion) {

		Session session = HibernateUtils.getSessionFactory()
				.getCurrentSession();
		Transaction tx = null;
		DenInvestigacionImpl investigacion = null;
		try {
			tx = session.beginTransaction();
			InvestigacionDAO investigacionDAO = new InvestigacionDAO();
			investigacionDAO.setSession(session);
			investigacion = investigacionDAO.buscarInvestigacion(cInvestigacion);
			tx.commit();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			tx.rollback();
		}
		return investigacion;

	}
	
	
	//TESTIGOS
	
	public void guardarTestigoInvestigacion(TestigoInvestigacion testigoInvestigacion) {
		DenTestigoInvestigacionImpl denTestigoInvestigacion = getTestigo(testigoInvestigacion.getCInvestigacion(), testigoInvestigacion.getCPersona());
		
		if (denTestigoInvestigacion == null)
		   denTestigoInvestigacion = new DenTestigoInvestigacionImpl();
		
		DenTestigoInvestigacionIdImpl denTestigoIdInvestigacion = new DenTestigoInvestigacionIdImpl();
		
		
		BeanUtils.copyProperties(testigoInvestigacion, denTestigoInvestigacion);
		BeanUtils.copyProperties(testigoInvestigacion, denTestigoIdInvestigacion);
		denTestigoIdInvestigacion.setCTestigo(testigoInvestigacion.getCPersona());
		
		denTestigoInvestigacion.setId(denTestigoIdInvestigacion);
		
		Session session = HibernateUtils.getSessionFactory()
		.getCurrentSession();
		Transaction tx = null;
		
		try{
			tx = session.beginTransaction();
			InvestigacionDAO investigacionDAO = new InvestigacionDAO();
			investigacionDAO.setSession(session);
			investigacionDAO.guardarTestigosInvestigacion(denTestigoInvestigacion);
			tx.commit();
		}catch (Exception e) {
			// TODO Auto-generated catch block
			tx.rollback();
		}
	}
	
	private DenTestigoInvestigacionImpl getTestigo(Integer cInvestigacion, Integer cTestigo) {
		DenTestigoInvestigacionImpl denTestigoInvestigacion= null;
		if (cTestigo == null) {
			denTestigoInvestigacion = new DenTestigoInvestigacionImpl();
		} else {
			denTestigoInvestigacion = buscarTestigo(cInvestigacion,cTestigo);
		}
		return denTestigoInvestigacion;
	}
	
	private DenTestigoInvestigacionImpl buscarTestigo(Integer cInvestigacion, Integer cTestigo) {

		Session session = HibernateUtils.getSessionFactory()
				.getCurrentSession();
		Transaction tx = null;
		DenTestigoInvestigacionImpl testigo = null;
		try {
			tx = session.beginTransaction();
			InvestigacionDAO investigacionDAO = new InvestigacionDAO();
			investigacionDAO.setSession(session);
			testigo = investigacionDAO.buscarTestigo(cInvestigacion, cTestigo);
			tx.commit();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			tx.rollback();
		}
		return testigo;

	}
	
	public void buscarTestigo(TestigoInvestigacion testigoInvestigacion) 
	{
		DenTestigoInvestigacionImpl denTestigoInvestigacion = getTestigo(testigoInvestigacion.getCInvestigacion(), testigoInvestigacion.getCPersona());
		BeanUtils.copyProperties( denTestigoInvestigacion, testigoInvestigacion);
		BeanUtils.copyProperties(denTestigoInvestigacion.getId(), testigoInvestigacion );
	}
	
	
	public Collection buscarTestigos(Integer cInvestigacion)
	{
		Session session = HibernateUtils.getSessionFactory()
		.getCurrentSession();
		Transaction tx = null;
		Collection testigos = new ArrayList();
		try {
			tx = session.beginTransaction();
			InvestigacionDAO investigacionDAO = new InvestigacionDAO();
			investigacionDAO.setSession(session);
			testigos = investigacionDAO.buscarTestigos(cInvestigacion);
			tx.commit();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			tx.rollback();
		}
		return testigos;
	}
	
	public Collection buscarTestigosSinInv(PersonaCompletaFlt personaCompletaFlt)
	{
		Session session = HibernateUtils.getSessionFactory()
		.getCurrentSession();
		Transaction tx = null;
		Collection testigos = new ArrayList();
		try {
			tx = session.beginTransaction();
			InvestigacionDAO investigacionDAO = new InvestigacionDAO();
			investigacionDAO.setSession(session);
			testigos = investigacionDAO.buscarPersonaSinInv(personaCompletaFlt);
			tx.commit();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			tx.rollback();
		}
		return testigos;
	}
	
	
	
	/* ********** ACUSADOS ****************/
	
	private DenAcusadoInvestigacionImpl getAcusado(Integer cInvestigacion, Integer cAcusado) {
		DenAcusadoInvestigacionImpl denAcusadoInvestigacion= null;
		if (cAcusado == null) {
			denAcusadoInvestigacion = new DenAcusadoInvestigacionImpl();
		} else {
			denAcusadoInvestigacion = buscarAcusado(cInvestigacion,cAcusado);
		}
		return denAcusadoInvestigacion;
	}
	
	private DenAcusadoInvestigacionImpl buscarAcusado(Integer cInvestigacion, Integer cAcusado) {

		Session session = HibernateUtils.getSessionFactory()
				.getCurrentSession();
		Transaction tx = null;
		DenAcusadoInvestigacionImpl acusado = null;
		try {
			tx = session.beginTransaction();
			InvestigacionDAO investigacionDAO = new InvestigacionDAO();
			investigacionDAO.setSession(session);
			acusado = investigacionDAO.buscarAcusado(cInvestigacion, cAcusado);
			tx.commit();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			tx.rollback();
		}
		return acusado;

	}
	
	public void guardarAcusadoInvestigacion(AcusadoInvestigacion acusadoInvestigacion) {
		DenAcusadoInvestigacionImpl denAcusadoInvestigacion = getAcusado(acusadoInvestigacion.getCInvestigacion(), acusadoInvestigacion.getCPersona());
		
		if (denAcusadoInvestigacion == null)
			denAcusadoInvestigacion = new DenAcusadoInvestigacionImpl();
		
		DenAcusadoInvestigacionIdImpl denAcusadoIdInvestigacion = new DenAcusadoInvestigacionIdImpl();
		
		
		BeanUtils.copyProperties(acusadoInvestigacion, denAcusadoInvestigacion);
		BeanUtils.copyProperties(acusadoInvestigacion, denAcusadoIdInvestigacion);
		denAcusadoIdInvestigacion.setCAcusado(acusadoInvestigacion.getCPersona());
		
		denAcusadoInvestigacion.setId(denAcusadoIdInvestigacion);
		
		Session session = HibernateUtils.getSessionFactory()
		.getCurrentSession();
		Transaction tx = null;
		
		try{
			tx = session.beginTransaction();
			InvestigacionDAO investigacionDAO = new InvestigacionDAO();
			investigacionDAO.setSession(session);
			investigacionDAO.guardarAcusadosInvestigacion(denAcusadoInvestigacion);
			tx.commit();
		}catch (Exception e) {
			// TODO Auto-generated catch block
			tx.rollback();
		}
	}
	
	public Collection buscarAcusados(Integer cInvestigacion)
	{
		Session session = HibernateUtils.getSessionFactory()
		.getCurrentSession();
		Transaction tx = null;
		Collection acusados = new ArrayList();
		try {
			tx = session.beginTransaction();
			InvestigacionDAO investigacionDAO = new InvestigacionDAO();
			investigacionDAO.setSession(session);
			acusados = investigacionDAO.buscarAcusados(cInvestigacion);
			tx.commit();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			tx.rollback();
		}
		return acusados;
	}
	
	public Collection buscarAcusadosSinInv(PersonaCompletaFlt personaCompletaFlt)
	{
		Session session = HibernateUtils.getSessionFactory()
		.getCurrentSession();
		Transaction tx = null;
		Collection acusados = new ArrayList();
		try {
			tx = session.beginTransaction();
			InvestigacionDAO investigacionDAO = new InvestigacionDAO();
			investigacionDAO.setSession(session);
			acusados = investigacionDAO.buscarAcusadoSinInv(personaCompletaFlt);
			tx.commit();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			tx.rollback();
		}
		return acusados;
	}
	
	public Collection buscarAcusadosSinInv(Integer cInvestigacion)
	{
		Session session = HibernateUtils.getSessionFactory()
		.getCurrentSession();
		Transaction tx = null;
		Collection acusados = new ArrayList();
		try {
			tx = session.beginTransaction();
			InvestigacionDAO investigacionDAO = new InvestigacionDAO();
			investigacionDAO.setSession(session);
			acusados = investigacionDAO.buscarAcusadosSinInv(cInvestigacion);
			tx.commit();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			tx.rollback();
		}
		return acusados;
	}
	
	
	public void buscarAcusado(AcusadoInvestigacion acusadoInvestigacion) 
	{
		DenAcusadoInvestigacionImpl denAcusadoInvestigacion = getAcusado(acusadoInvestigacion.getCInvestigacion(), acusadoInvestigacion.getCPersona());
		BeanUtils.copyProperties( denAcusadoInvestigacion, acusadoInvestigacion);
		BeanUtils.copyProperties(denAcusadoInvestigacion.getId(), acusadoInvestigacion );
	}
	
	/* ********** ******* ****************/
	public static void main(String [] arg)
	{
		InvestigacionService investigacion = new InvestigacionService();
		 System.out.println(investigacion.buscarTestigos(84).size());
		 PersonaCompletaFlt personaFlt = new PersonaCompletaFlt();
		 personaFlt.setTipoPersona("1");
		 System.out.println(investigacion.buscarTestigosSinInv(personaFlt));
		 
	}
}
